home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Reverse Code Engineering RCE CD +sandman 2000
/
ReverseCodeEngineeringRceCdsandman2000.iso
/
RCE
/
Tools
/
Turbo Pascal V7
/
TVDEMOS.ZIP
/
TVRDEMO.PAS
< prev
Wrap
Pascal/Delphi Source File
|
1992-11-03
|
15KB
|
598 lines
{************************************************}
{ }
{ Turbo Vision Demo }
{ Copyright (c) 1992 by Borland International }
{ }
{************************************************}
{ Turbo Vision demo program. This program demonstrates the use of
resource files and overlays to build a Turbo Vision application.
This program duplicates the functionality of TVDEMO but gets the
definition of menus, status line, and various dialogs off of a
resource file. GENRDEMO.PAS generates the resource file that is used
by this program. To build this program, execute the batch file,
MKRDEMO.BAT which will create the resource file and overlay file
and copy them into the TVRDEMO.EXE file where this program looks
for them.
Note: This program is designed for real-mode use only.
}
program TVRDemo;
{$X+,S-}
{$M 16384,8192,655360}
uses
Dos, Objects, Drivers, Memory, Views, Menus, Dialogs, StdDlg, HistList,
MsgBox, App, DemoCmds, DemoStrs, Gadgets, Puzzle, Calendar, AsciiTab,
Calc, HelpFile, DemoHelp, ColorSel, MouseDlg, Editors, Overlay;
{ If you get a FILE NOT FOUND error when compiling this program,
use the MKRDEMO.BAT file described above.
}
{$O Views}
{$O Menus}
{$O Dialogs}
{$O StdDlg}
{$O MsgBox}
{$O App}
{$O HelpFile}
{$O Gadgets}
{$O Puzzle}
{$O Calendar}
{$O AsciiTab}
{$O Calc}
{$O ColorSel}
{$O MouseDlg}
{$O Editors}
const
HeapSize = 48 * (1024 div 16); { Save 48k heap for main program }
{ Desktop file signature information }
SignatureLen = 21;
DSKSignature : string[SignatureLen] = 'TV Demo Desktop File'#26;
var
ClipWindow: PEditWindow;
type
{ TTVDemo }
PTVDemo = ^TTVDemo;
TTVDemo = object(TApplication)
Clock: PClockView;
Heap: PHeapView;
constructor Init;
procedure FileOpen(WildCard: PathStr);
function OpenEditor(FileName: FNameStr; Visible: Boolean): PEditWindow;
procedure GetEvent(var Event: TEvent); virtual;
function GetPalette: PPalette; virtual;
procedure HandleEvent(var Event: TEvent); virtual;
procedure Idle; virtual;
procedure InitMenuBar; virtual;
procedure InitStatusLine; virtual;
procedure LoadDesktop(var S: TStream);
procedure OutOfMemory; virtual;
procedure StoreDesktop(var S: TStream);
end;
type
PProtectedStream = ^TProtectedStream;
TProtectedStream = object(TBufStream)
procedure Error(Code, Info: Integer); virtual;
end;
var
EXEName: PathStr;
RezFile: TResourceFile;
RezStream: PStream;
Strings: PStringList;
{ CalcHelpName }
function CalcHelpName: PathStr;
var
EXEName: PathStr;
Dir: DirStr;
Name: NameStr;
Ext: ExtStr;
begin
if Lo(DosVersion) >= 3 then EXEName := ParamStr(0)
else EXEName := FSearch('TVDEMO.EXE', GetEnv('PATH'));
FSplit(EXEName, Dir, Name, Ext);
if Dir[Length(Dir)] = '\' then Dec(Dir[0]);
CalcHelpName := FSearch('DEMOHELP.HLP', Dir);
end;
{ Resource MessageBox wrappers }
function RMessageBox(StrNum: Word; Param: Pointer; Flags: Word): Word;
begin
RMessageBox := MessageBox(Strings^.Get(StrNum), Param, Flags);
end;
function RMessageBoxRect(var Rect: TRect; StrNum: Word; Param: Pointer;
Flags: Word): Word;
begin
RMessageBoxRect := MessageBoxRect(Rect, Strings^.Get(StrNum), Param,
Flags);
end;
{ Editor dialog call-back }
function DoEditDialog(Dialog: Integer; Info: Pointer): Word; far;
var
R: TRect;
T: TPoint;
function ExecDialog(const Dialog: String; Param: Pointer): Word;
begin
ExecDialog := Application^.ExecuteDialog(PDialog(RezFile.Get(Dialog)),
Param);
end;
begin
case Dialog of
edOutOfMemory:
DoEditDialog := RMessageBox(sNoMem, nil, mfError + mfOkButton);
edReadError:
DoEditDialog := RMessageBox(sErrorReading, @Info, mfError + mfOkButton);
edWriteError:
DoEditDialog := RMessageBox(sErrorWriting, @Info, mfError + mfOkButton);
edCreateError:
DoEditDialog := RMessageBox(sErrorCreating, @Info, mfError + mfOkButton);
edSaveModify:
DoEditDialog := RMessageBox(sModified, @Info,
mfInformation + mfYesNoCancel);
edSaveUntitled:
DoEditDialog := RMessageBox(sSaveUntitled, nil,
mfInformation + mfYesNoCancel);
edSaveAs:
DoEditDialog := ExecDialog('SaveAsDialog', Info);
edFind:
DoEditDialog := ExecDialog('FindDialog', Info);
edSearchFailed:
DoEditDialog := RMessageBox(sStrNotFound, nil, mfError + mfOkButton);
edReplace:
DoEditDialog := ExecDialog('ReplaceDialog', Info);
edReplacePrompt:
begin
{ Avoid placing the dialog on the same line as the cursor }
R.Assign(0, 1, 40, 8);
R.Move((Desktop^.Size.X - R.B.X) div 2, 0);
Desktop^.MakeGlobal(R.B, T);
Inc(T.Y);
if TPoint(Info).Y <= T.Y then
R.Move(0, Desktop^.Size.Y - R.B.Y - 2);
DoEditDialog := RMessageBoxRect(R, sReplace, nil,
mfYesNoCancel + mfInformation);
end;
end;
end;
{ TProtectedStream }
procedure TProtectedStream.Error(Code, Info: Integer);
begin
DoneHistory;
DoneSysError;
DoneEvents;
DoneVideo;
DoneMemory;
Writeln('Error in stream: Code = ', Code, ' Info = ', Info);
Halt(1);
end;
{ TTVDemo }
constructor TTVDemo.Init;
var
R: TRect;
I: Integer;
FileName: PathStr;
begin
{ Initalize editor heap }
MaxHeapSize := HeapSize;
{ Initialize resource file }
RezStream := New(PProtectedStream, Init(EXEName, stOpenRead, 4096));
RezFile.Init(RezStream);
RegisterObjects;
RegisterViews;
RegisterMenus;
RegisterDialogs;
RegisterApp;
RegisterStdDlg;
RegisterColorSel;
RegisterHelpFile;
RegisterPuzzle;
RegisterCalendar;
RegisterAsciiTab;
RegisterCalc;
RegisterEditors;
RegisterType(RStringList);
Strings := PStringList(RezFile.Get('Strings'));
inherited Init;
{ Initialize demo gadgets }
GetExtent(R);
R.A.X := R.B.X - 9; R.B.Y := R.A.Y + 1;
Clock := New(PClockView, Init(R));
Insert(Clock);
GetExtent(R);
Dec(R.B.X);
R.A.X := R.B.X - 9; R.A.Y := R.B.Y - 1;
Heap := New(PHeapView, Init(R));
Insert(Heap);
DisableCommands([cmSave, cmSaveAs, cmCut, cmCopy, cmPaste, cmClear,
cmUndo, cmFind, cmReplace, cmSearchAgain, cmCloseAll]);
EditorDialog := DoEditDialog;
ClipWindow := OpenEditor('', False);
if ClipWindow <> nil then
begin
Clipboard := ClipWindow^.Editor;
Clipboard^.CanUndo := False;
end;
for I := 1 to ParamCount do
begin
FileName := ParamStr(I);
if FileName[Length(FileName)] = '\' then
FileName := FileName + '*.*';
if (Pos('?', FileName) = 0) and (Pos('*', FileName) = 0) then
OpenEditor(FExpand(FileName), True)
else FileOpen(FileName);
end;
end;
function TTVDemo.OpenEditor(FileName: FNameStr; Visible: Boolean): PEditWindow;
var
P: PView;
R: TRect;
begin
DeskTop^.GetExtent(R);
P := Application^.ValidView(New(PEditWindow,
Init(R, FileName, wnNoNumber)));
if not Visible then P^.Hide;
DeskTop^.Insert(P);
OpenEditor := PEditWindow(P);
end;
procedure TTVDemo.FileOpen(WildCard: PathStr);
var
FileName: PathStr;
begin
FileName := '*.*';
if ExecuteDialog(PDialog(RezFile.Get('FileOpenDialog')),
@FileName) <> cmCancel then
OpenEditor(FileName, True);
end;
procedure TTVDemo.GetEvent(var Event: TEvent);
var
W: PWindow;
HFile: PHelpFile;
HelpStrm: PDosStream;
const
HelpInUse: Boolean = False;
begin
TApplication.GetEvent(Event);
case Event.What of
evCommand:
if (Event.Command = cmHelp) and not HelpInUse then
begin
HelpInUse := True;
HelpStrm := New(PDosStream, Init(CalcHelpName, stOpenRead));
HFile := New(PHelpFile, Init(HelpStrm));
if HelpStrm^.Status <> stOk then
begin
RMessageBox(sErrorHelp, nil, mfError + mfOkButton);
Dispose(HFile, Done);
end
else
begin
W := New(PHelpWindow,Init(HFile, GetHelpCtx));
if ValidView(W) <> nil then
begin
ExecView(W);
Dispose(W, Done);
end;
ClearEvent(Event);
end;
HelpInUse := False;
end;
evMouseDown:
if Event.Buttons <> 1 then Event.What := evNothing;
end;
end;
function TTVDemo.GetPalette: PPalette;
const
CNewColor = CAppColor + CHelpColor;
CNewBlackWhite = CAppBlackWhite + CHelpBlackWhite;
CNewMonochrome = CAppMonochrome + CHelpMonochrome;
P: array[apColor..apMonochrome] of string[Length(CNewColor)] =
(CNewColor, CNewBlackWhite, CNewMonochrome);
begin
GetPalette := @P[AppPalette];
end;
procedure TTVDemo.HandleEvent(var Event: TEvent);
procedure ChangeDir;
begin
ExecuteDialog(PDialog(RezFile.Get('ChDirDialog')), nil);
end;
procedure Puzzle;
var
P: PPuzzleWindow;
begin
P := New(PPuzzleWindow, Init);
P^.HelpCtx := hcPuzzle;
InsertWindow(P);
end;
procedure Calendar;
var
P: PCalendarWindow;
begin
P := New(PCalendarWindow, Init);
P^.HelpCtx := hcCalendar;
InsertWindow(P);
end;
procedure About;
var
D: PDialog;
Control: PView;
R: TRect;
begin
ExecuteDialog(PDialog(RezFile.Get('AboutDialog')), nil);
end;
procedure AsciiTab;
var
P: PAsciiChart;
begin
P := New(PAsciiChart, Init);
P^.HelpCtx := hcAsciiTable;
InsertWindow(P);
end;
procedure Calculator;
var
P: PCalculator;
begin
P := New(PCalculator, Init);
P^.HelpCtx := hcCalculator;
InsertWindow(P);
end;
procedure Colors;
begin
if ExecuteDialog(PDialog(RezFile.Get('ColorSelectDialog')),
Application^.GetPalette) <> cmCancel then
begin
DoneMemory;
ReDraw;
end;
end;
procedure Mouse;
var
D: PDialog;
begin
D := New(PMouseDialog, Init);
D^.HelpCtx := hcOMMouseDBox;
ExecuteDialog(D, @MouseReverse);
end;
procedure RetrieveDesktop;
var
S: PStream;
Signature: string[SignatureLen];
begin
S := New(PBufStream, Init('TVRDEMO.DSK', stOpenRead, 1024));
if LowMemory then OutOfMemory
else if S^.Status <> stOk then
RMessageBox(sErrorOpenDesk, nil, mfOkButton + mfError)
else
begin
Signature[0] := Char(SignatureLen);
S^.Read(Signature[1], SignatureLen);
if Signature = DSKSignature then
begin
LoadDesktop(S^);
LoadIndexes(S^);
LoadHistory(S^);
if S^.Status <> stOk then
RMessageBox(sErrorReadingDesk, nil, mfOkButton + mfError);
end
else
RMessageBox(sDeskInvalid, nil, mfOkButton + mfError);
end;
Dispose(S, Done);
end;
procedure SaveDesktop;
var
S: PStream;
F: File;
begin
S := New(PBufStream, Init('TVRDEMO.DSK', stCreate, 1024));
if not LowMemory and (S^.Status = stOk) then
begin
S^.Write(DSKSignature[1], SignatureLen);
StoreDesktop(S^);
StoreIndexes(S^);
StoreHistory(S^);
if S^.Status <> stOk then
begin
RMessageBox(sErrorDeskCreate, nil, mfOkButton + mfError);
{$I-}
Dispose(S, Done);
Assign(F, 'TVRDEMO.DSK');
Erase(F);
Exit;
end;
end;
Dispose(S, Done);
end;
procedure FileNew;
begin
OpenEditor('', True);
end;
procedure ShowClip;
begin
ClipWindow^.Select;
ClipWindow^.Show;
end;
begin
inherited HandleEvent(Event);
case Event.What of
evCommand:
begin
case Event.Command of
cmOpen: FileOpen('*.*');
cmNew: FileNew;
cmShowClip: ShowClip;
cmChangeDir: ChangeDir;
cmAbout: About;
cmPuzzle: Puzzle;
cmCalendar: Calendar;
cmAsciiTab: AsciiTab;
cmCalculator: Calculator;
cmColors: Colors;
cmMouse: Mouse;
cmSaveDesktop: SaveDesktop;
cmRetrieveDesktop: RetrieveDesktop;
else
Exit;
end;
ClearEvent(Event);
end;
end;
end;
procedure TTVDemo.Idle;
function IsTileable(P: PView): Boolean; far;
begin
IsTileable := (P^.Options and ofTileable <> 0) and
(P^.State and sfVisible <> 0);
end;
begin
TApplication.Idle;
Clock^.Update;
Heap^.Update;
if Desktop^.FirstThat(@IsTileable) <> nil then
EnableCommands([cmTile, cmCascade])
else
DisableCommands([cmTile, cmCascade]);
end;
procedure TTVDemo.InitMenuBar;
begin
MenuBar := PMenuBar(RezFile.Get('MenuBar'));
end;
procedure TTVDemo.InitStatusLine;
begin
StatusLine := PStatusLine(RezFile.Get('StatusLine'));
end;
procedure TTVDemo.OutOfMemory;
begin
RMessageBox(sNoMem, nil, mfError + mfOkButton);
end;
{ Since the safety pool is only large enough to guarantee that allocating
a window will not run out of memory, loading the entire desktop without
checking LowMemory could cause a heap error. This means that each
window should be read individually, instead of using Desktop's Load.
}
procedure TTVDemo.LoadDesktop(var S: TStream);
var
P: PView;
Pal: PString;
procedure CloseView(P: PView); far;
begin
Message(P, evCommand, cmClose, nil);
end;
begin
if Desktop^.Valid(cmClose) then
begin
Desktop^.ForEach(@CloseView); { Clear the desktop }
repeat
P := PView(S.Get);
Desktop^.InsertBefore(ValidView(P), Desktop^.Last);
until P = nil;
Pal := S.ReadStr;
if Pal <> nil then
begin
Application^.GetPalette^ := Pal^;
DoneMemory;
Application^.ReDraw;
DisposeStr(Pal);
end;
end;
end;
procedure TTVDemo.StoreDesktop(var S: TStream);
var
Pal: PString;
procedure WriteView(P: PView); far;
begin
if P <> Desktop^.Last then S.Put(P);
end;
begin
Desktop^.ForEach(@WriteView);
S.Put(nil);
Pal := @Application^.GetPalette^;
S.WriteStr(Pal);
end;
var
Demo: TTVDemo;
begin
if Lo(DosVersion) >= 3 then EXEName := ParamStr(0)
else
begin
EXEName := FSearch('TVRDEMO.EXE', GetEnv('PATH'));
if EXEName = '' then PrintStr('TVRDEMO.EXE could not be found.'#13#10);
end;
OvrInit(EXEName);
OvrSetBuf(58 * 1024);
if OvrResult <> ovrOk then
begin
PrintStr('No overlays found in .EXE file. Must use MKRDEMO.BAT to build.'#13#10);
Halt(1);
end;
Demo.Init;
Demo.Run;
Demo.Done;
end.